package xiaoqi.springboot.boot.core.validator;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.Arrays;
import java.util.Collections;
import java.util.Set;
import java.util.stream.Collectors;
/*
实现 ConstraintValidator 接口
第一个泛型为 A extends Annotation ，设置对应的自定义约束的注解。例如说，这里我们设置了 @InEnum 注解。
第二个泛型为 T ，设置对应的参数值的类型。例如说，这里我们设置了 Integer 类型。*/
public class InEnumValidator implements ConstraintValidator<InEnum, Integer> {


    /*值数组*/
    private Set<Integer> values;


    @Override
    public void initialize(InEnum annotation) {
        IntArrayValuable[] values = annotation.value().getEnumConstants();
        if (values.length == 0) {
            this.values = Collections.emptySet();
        } else {
            this.values = Arrays.stream(values[0].array()).boxed().collect(Collectors.toSet());
        }
    }


    @Override
    public boolean isValid(Integer value, ConstraintValidatorContext context) {
        /*校验通过*/
        if (values.contains(value)) {
            return true;
        }
        /*校验不通过, 自定义提示语句 （因为住街上的 value 是枚举类， 无法获取枚举类的实际值*/
        context.disableDefaultConstraintViolation(); // 禁用默认的 message
        context.buildConstraintViolationWithTemplate(context.getDefaultConstraintMessageTemplate().
                replaceAll("\\{value}", values.toString())).addConstraintViolation(); // 重新添加错误语句提示
        return false;
    }
}
